<?php
/**
 * CreateUser:zlh
 * CreateTime:2022/1/15
 * Remark:该方法主要是基础数据模型层，包含了对数据模型的基本操作。
 * - 该类目前功能是转换标准化时间格式为时间戳。
 */
namespace App\Models;

use App\Consts\BaseConsts\BaseConsts;
use App\Models\Company\CompanyModel;
use App\Models\Department\DepartmentModel;
use App\Models\Position\PositionModel;
use App\Scopes\DbHandleScope;
use DateTime;
use Illuminate\Database\Eloquent\Model;
use JetBrains\PhpStorm\ArrayShape;

class BaseModel extends Model
{

    public $timestamps = false;
//    /**
//     * 默认使用时间戳戳功能
//     *
//     * @var bool
//     */
//    public $timestamps = true;
//
//    /**
//     * 获取当前时间
//     *
//     * @return int
//     */
//    public function freshTimestamp(): int
//    {
//        return time();
//    }
//
//    /**
//     * 避免转换时间戳为时间字符串
//     *
//     * @param DateTime|int $value
//     * @return DateTime|int
//     */
//    public function fromDateTime($value): DateTime|int
//    {
//        return $value;
//    }
//
//    /**
//     * select的时候避免转换时间为 Carbon
//     *
//     * @param mixed $value
//     * @return mixed
//     */
////      protected function asDateTime($value): mixed
////      {
////    	  return $value;
////      }
//
//    /**
//     * 从数据库获取的为获取时间戳格式
//     *
//     * @return string
//     */
//    public function getDateFormat(): string
//    {
//        return 'U';
//    }

    /**
     * 注册全局作用域
     */
    protected static function booted()
    {
//        static::addGlobalScope(new DbHandleScope());
    }


    /**
     * editChecker names 设置参数
     * @param $nameStr
     * @param $name
     * @return array
     */
    #[ArrayShape(['name_str' => "", 'name' => ""])]
    public function setGetEditCheckerNames($nameStr, $name): array
    {
        return [
            'name_str' => $nameStr,
            'name' => $name,
        ];
    }

    /**
     * editChecker conditions 参数设置子项
     * @param string $key
     * @param string $op
     * @param string $value
     * @return array
     */
    #[ArrayShape(['key' => "", 'op' => "", 'value' => ""])]
    public function setGetEditCheckerCondition(string $key, string $value, string $op = "="): array
    {
        return [
            'key' => $key,
            'op' => $op,
            'value' => $value,
        ];
    }

    /**
     * editChecker ids 设置参数
     * @param $idStr
     * @param $id
     * @return array
     */
    #[ArrayShape(['id_str' => "", 'id' => ""])]
    public function setGetEditCheckerIds($idStr, $id): array
    {
        return [
            'id_str' => $idStr,
            'id' => $id
        ];
    }

    /**
     * 用于做checker校验
     * @param array $names
     * @param array $ids
     * @param array $conditions
     */
    public function editNameChecker(array $names,array $ids,array $conditions = []){
        $query = $this
            ->withoutGlobalScopes()
            ->select([$ids['id_str']]);
        if($conditions){
            foreach($conditions as $condition){
                $query = $query->where($condition['key'],$condition['op'],$condition['value']);
            }
        }
        return $query
            ->where($names['name_str'],$names['name'])
            ->where($ids['id_str'],"!=",$ids['id'])
            ->first();
    }

    /**基础数据校验
     * @param $conditionData
     * @return mixed
     */
    public function isExistByCondition($conditionData){
        return $this
            ->withoutGlobalScopes()
            ->firstOrnew($conditionData)
            ->exists;
    }

    // ===========================================自定义

    /**
     * 根据方法来控制字段返回方式
     * @param $value
     * @return string
     */
//    public function getCreatedAtAttribute($value): string
//    {
//        return date('Y-m-d',strtotime($value));
//    }
//
//    public function getUpdatedAtAttribute($value): string
//    {
//        return date('Y-m-d',strtotime($value));
//    }

    /**
     * 状态
     * @param $value
     * @return string
     */
    public function getStatusStrAttribute($value): string
    {
        if($value == BaseConsts::STATUS_NORMAL){
            return "正常";
        }
        return "已删除";
    }

    // ===========================================公司

//    /**
//     * 公司code
//     * @param $value
//     * @return string
//     */
//    public function getCompanyCodeAttribute($value): string{
//        return "GS".str_pad($value,5,0,STR_PAD_LEFT);
//    }

    /**
     * 公司层级
     * @param $value
     * @return int
     */
    public function getCompanyLevelNameAttribute($value): int{
        return substr_count($value, ".");
    }

    /**
     * 获取父公司名称
     * @param $value
     * @return string
     */
    public function getCompanyParentNameAttribute($value): string{
       $companyModel = new CompanyModel();
       $companyInfo = $companyModel->getCompanyInfoModelByCompanyId($value,["company_name","status"]);
       if(!isset($companyInfo)){
            return "";
       }
       $str = "";
       if($companyInfo['status'] == BaseConsts::STATUS_DELETE){
           $str = "(已删除)";
       }
       return $companyInfo['company_name'].$str ?? "";
    }
    // ===========================================部门
    /**
     * 部门code
     * @param $value
     * @return string
     */
    public function getDepartmentCodeAttribute($value): string{
        return "BM".str_pad($value,5,0,STR_PAD_LEFT);
    }

    /**
     * 获取部门父亲名称
     * @param $value
     * @return string
     */
    public function getDepartmentParentNameAttribute($value): string{
        $departmentModel = new DepartmentModel();
        $departmentInfo = $departmentModel->getDepartmentInfoByDepartmentIdModel($value,["department_name"]);
        return $departmentInfo['department_name'] ?? "";
    }

    // ===========================================用户 部门 职位 关联

    /**
     * 获取公司名称
     * @param $value
     * @return string
     */
    public function getCompanyNameStrAttribute($value): string
    {
        $companyModel = new CompanyModel();
        $companyInfo = $companyModel->getCompanyInfoModelByCompanyId($value,['company_name']);
        $str = "";
        if(isset($companyInfo) && $companyInfo['status'] == BaseConsts::STATUS_DELETE){
            $str = "(已删除)";
        }
        return $companyInfo['company_name'].$str ?? "";
    }

    public function getPositionNameStrAttribute($value){
        $positionModel = new PositionModel();
        $companyInfo = $positionModel->getPositionInfoByPositionId($value,['position_name']);
        return $companyInfo['position_name'] ?? "";
    }

    /**
     * 处理员工最后登录时间
     * @param $value
     * @return string|void
     */
    public function getStaffLastLoginTimeNameAttribute($value){
       return $value ?? "-";
    }

    /**
     * 处理员工启用停用状态
     * @param $value
     * @return string
     */
    public function getStaffStatusNameAttribute($value): string
    {
        return $value == 1 ? "启用" : "停用";
    }

    /**
     * 员工状态修改
     * @param $value
     * @return bool
     */
    public function getStaffStatusAttribute($value):bool{
        return $value == 1;
    }


    /**
     * 性别
     * @param $value
     * @return string
     */
    public function getStaffSexStrAttribute($value): string
    {
        return $value == 1 ? "男" : "女";
    }

    /**
     * 是否钉钉操作
     * @param $value
     * @return bool
     */
    public function getIsOpenDingTalkAttribute($value): bool
    {
        return $value == 1;
    }



}